﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using GestaoContas.LigacaoBD;

namespace GestaoContas
{
    public partial class FormPrincipal : Form
    {
        //private Login _loginDialog;
        private string _tipoDeUser;
        private string _userName = null;
        private bool _logged = false;
        private FicheiroConfiguracao _connectionString;

        public FormPrincipal()
        {

            InitializeComponent();

            _connectionString = new FicheiroConfiguracao();
            FazerLogin();




            // teste para o mdi
            //PesquisaContas pc = new PesquisaContas();
            //pc.MdiParent = this;
            //pc.Show();
        }

        private void AplicarDireitos()
        {
            if (_tipoDeUser == "Administrador")
            {
                contasToolStripMenuItem.Enabled = true;
                criarToolStripMenuItem.Enabled = true;
                gerirToolStripMenuItem.Enabled = true;
                //configuraçãoToolStripMenuItem.Enabled = true;
            }
            if (_tipoDeUser == "Funcionario")
            {
                contasToolStripMenuItem.Enabled = true;
                criarToolStripMenuItem.Enabled = false;
                gerirToolStripMenuItem.Enabled = true;
                //configuraçãoToolStripMenuItem.Enabled = true;
            }
            //if (_tipoDeUser == "EE")
            //{
            //    contasToolStripMenuItem.Enabled = false;
            //    criarToolStripMenuItem.Enabled = false;
            //    gerirToolStripMenuItem.Enabled = false;
            //    configuraçãoToolStripMenuItem.Enabled = false;
            //}
        }

        private void LimparDireitos()
        {
            contasToolStripMenuItem.Enabled = false;
        }

        /// <summary>
        /// Fecha todas as janelas abertas na aplicação à excepção da principal.
        /// </summary>
        private void FechaJanelas()
        {
            if (this.MdiChildren.Length > 0)    //fecha os mdichildrens se houver algum aberto
            {
                foreach (Form childForm in this.MdiChildren)
                    childForm.Close();
            }
        }

        private void FazerLogin()
        {
            string userName = null;
            int tentativasErradas = 0;
            Login loginDialog = new Login();

            while (tentativasErradas < 3)
            {
                if (loginDialog.ShowDialog() == DialogResult.OK)
                {
                    userName = loginDialog.User;
                }
                if (userName == "!#$%&/()=")
                {
                    tentativasErradas++;
                    userName = null;
                }
                else
                {
                    break;
                }
            }
            if (userName == null)
            {
                toolStripStatusLabelLogin.Text = "Deslogado";
            }
            else
            {
                _logged = true;
                _tipoDeUser = ProcuraTipoDeUser(userName);  // verifica que tipo de user é username recebido
                toolStripStatusLabelLogin.Text = "Logado: " + userName + " (" + _tipoDeUser + ")";
            }

            _userName = userName;
            AplicarDireitos();
        }

        /// <summary>
        /// Procura o tipo de user segundo o username fornecido.
        /// </summary>
        /// <param name="userName">Username</param>
        /// <returns>Retorna Administador, EE ou Funcionario</returns>
        private string ProcuraTipoDeUser(string userName)
        {
            string tipoDeUser = null;
            string query = @"SELECT RoleName FROM aspnet_Roles WHERE RoleId = 
                            (SELECT RoleId FROM aspnet_UsersInRoles WHERE UserId = 
                            (SELECT UserId FROM aspnet_Users WHERE UserName = '" + userName + "'))";

            //string connectionString = "Data Source=MARLEY-LAPTOP\\SQLEXPRESS;Initial Catalog=ASPNETDB;Integrated Security=True";
            string connectionString = _connectionString.GetConnectionStringLogin();

            try
            {
                SqlConnection conn = new SqlConnection();
                conn.ConnectionString = connectionString;

                conn.Open();

                using (SqlCommand cmd = new SqlCommand(query, conn))
                {
                    using (SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection))
                    {
                        reader.Read();
                        tipoDeUser = reader[0].ToString();
                        reader.Close();
                    }
                }
                conn.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Erro na ligação à base de dados. \nVerifique a configuração.", "Erro!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            return tipoDeUser;
        }


        private void sairToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.Close();

        }

        private void loginToolStripMenuItem_Click(object sender, EventArgs e)
        {
            FechaJanelas();
            if (_logged)
            {
                _logged = false;
                _userName = null;
                _tipoDeUser = null;
                LimparDireitos();
            }
            FazerLogin();
        }

        private void logoffToolStripMenuItem_Click(object sender, EventArgs e)
        {
            _logged = false;
            _userName = null;
            _tipoDeUser = null;
            LimparDireitos();
            toolStripStatusLabelLogin.Text = "Deslogado";
            FechaJanelas();
        }

        private void configuraçãoToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Ligacao ligacaoConfig = new Ligacao();
            ligacaoConfig.MdiParent = this;
            ligacaoConfig.Show();

        }

        private void criarToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Conta criarConta = new Conta();
            criarConta.MdiParent = this;
            criarConta.Text = "Criar Conta";
            criarConta.Show();
        }

        private void gerirToolStripMenuItem_Click(object sender, EventArgs e)
        {
            PesquisaContas pesquisa = new PesquisaContas(_tipoDeUser);
            pesquisa.MdiParent = this;
            pesquisa.Show();
        }

    }
}
